import globals from 'globals';
import pluginJs from '@eslint/js';
import tseslint from 'typescript-eslint';
import pluginReact from 'eslint-plugin-react';
import prettier from 'eslint-config-prettier';

/** @type {import('eslint').Linter.Config[]} */
export default [
  { files: ['**/*.{js,mjs,cjs,ts,jsx,tsx}'] },
  { languageOptions: { globals: { ...globals.browser, process: true } } }, // 添加 process 到全局变量
  pluginJs.configs.recommended,
  ...tseslint.configs.recommended,
  pluginReact.configs.flat.recommended,
  {
    plugins: {
      prettier,
    },
    rules: {
      // React 相关规则
      'react/react-in-jsx-scope': 'off', // 使用 React 17+ 时，不需要在 JSX 文件中导入 React
      'react/prop-types': 'off', // 使用 TypeScript 时，可以关闭 prop-types 检查
      'react/jsx-filename-extension': ['warn', { extensions: ['.tsx'] }], // 允许在 .tsx 文件中使用 JSX

      // TypeScript 相关规则
      '@typescript-eslint/explicit-module-boundary-types': 'off', // 不强制要求导出函数和类的公共类方法的显式返回和参数类型
      '@typescript-eslint/no-explicit-any': 'warn', // 警告使用 any 类型
      '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], // 禁止未使用的变量，但忽略以下划线开头的参数

      // 常用的代码风格规则
      'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', // 生产环境警告 console 的使用
      'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', // 生产环境禁止使用 debugger
      'prefer-const': 'error', // 优先使用 const
      'no-var': 'error', // 禁止使用 var
      eqeqeq: ['error', 'always'], // 要求使用 === 和 !==

      // 函数相关规则
      'func-style': ['error', 'expression'], // 优先使用函数表达式而不是函数声明
      'arrow-body-style': ['error', 'as-needed'], // 当只有一个表达式时，省略箭头函数的大括号

      // 错误预防规则
      'no-unused-expressions': 'error', // 禁止出现未使用过的表达式
      'no-use-before-define': [
        'error',
        { functions: false, classes: true, variables: true },
      ], // 禁止在变量定义之前使用它们
    },
  },
];
